#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>

//int main()
//{
//    printf("hello dudu\n");
//    execl("/usr/bin/ls", "ls", "-a", "-l", NULL);
//    printf("hello dongdong\n");//一旦执行这条语句，execl一定出错了
//    exit(errno);
//    return 0;
//}


//int main()
//{
//    printf("hello dudu\n");
//    execl("./others", "./others", NULL);
//    printf("hello dongdong\n");//一旦执行这条语句，execl一定出错了
//    exit(errno);
//    return 0;
//}



//int main()
//{
//    printf("hello dudu\n");
//    pid_t id;
//    if((id = fork()) == 0)
//    {
//        //child process
//        execl("./others", "./others", NULL);
//        exit(errno);
//    }
//    waitpid(-1, NULL, 0);
//    printf("hello totoro\n");
//    return 0;
//}


//int main()
//{
//    printf("hello dudu\n");
//    pid_t id;
//    if((id = fork()) == 0)
//    {
//        //child process
//        execlp("ls", "ls", "-a", "-l", NULL);
//        exit(errno);
//    }
//    waitpid(-1, NULL, 0);
//    printf("hello totoro\n");
//    return 0;
//}


//int main()
//{
//    printf("hello dudu\n");
//    pid_t id;
//    if((id = fork()) == 0)
//    {
//        //child process
//        char* const argv[] = {(char* const)"./others", NULL};
//        execv("./others", argv);
//        exit(errno);
//    }
//    waitpid(-1, NULL, 0);
//    printf("hello totoro\n");
//    return 0;
//}


//int main()
//{
//    printf("hello dudu\n");
//    pid_t id;
//    if((id = fork()) == 0)
//    {
//        //child process
//        char* const argv[] = {(char* const)"ls", (char* const)"-a", (char* const)"-l", NULL};
//        execvp("ls", argv);
//        exit(errno);
//    }
//    waitpid(-1, NULL, 0);
//    printf("hello totoro\n");
//    return 0;
//}


//int main()
//{
//    printf("hello dudu\n");
//    pid_t id;
//    if((id = fork()) == 0)
//    {
//        //child process
//        char* const argv[] = {(char* const)"./others", (char* const)"-a", (char* const)"-l", NULL};//others指令本没有选项，只是为了验证execvpe功能故意带上
//        char* const envg[] = {(char* const)"MYENV=123456", NULL};
//        //execvpe使用全新envg
//        execvpe("./others", argv, envg);//这个函数按道理说不用传路径，它会去环境变量找，这样子写只是为了验证这个函数的功能
//        exit(errno);
//    }
//    waitpid(-1, NULL, 0);
//    printf("hello totoro\n");
//    return 0;
//}


//如果只是想要在原本环境变量基础下新增环境变量呢？有两种办法

//办法一
//extern char** environ;
//
//char* const newEnv[] = {(char* const)"MYENV1=12345", (char* const)"MYENV2=12345678", NULL};
//
//int main()
//{
//    printf("hello dudu\n");
//    pid_t id;
//    if((id = fork()) == 0)
//    {
//        //child process
//        char* const argv[] = {(char* const)"./others", (char* const)"-a", (char* const)"-l", NULL};//others指令本没有选项，只是为了验证execvpe功能故意带上
//        //导入新环境变量  
//        int i;
//        for(i = 0; newEnv[i]; ++i)
//            putenv(newEnv[i]);
//        execvpe("./others", argv, environ);//这个函数按道理说不用传路径，它会去环境变量找，这样子写只是为了验证这个函数的功能
//        exit(errno);
//    }
//    waitpid(-1, NULL, 0);
//    printf("hello totoro\n");
//    return 0;
//}


//方法二

//int main()
//{
//    printf("hello dudu\n");
//    pid_t id;
//    if((id = fork()) == 0)
//    {
//        //child process
//        char* const argv[] = {(char* const)"./others", (char* const)"-a", (char* const)"-l", NULL};
//        putenv((char*)"MYENV=123456");//直接导入新增环境变量
//        execv("./others", argv);
//        exit(errno);
//    }
//    waitpid(-1, NULL, 0);
//    printf("hello totoro\n");
//    return 0;
//}


//extern char** environ;
//int main()
//{
//    printf("hello dudu\n");
//    pid_t id;
//    if((id = fork()) == 0)
//    {
//        //child process
//        execle("./others", "./others", NULL, environ);
//        exit(errno);
//    }
//    waitpid(-1, NULL, 0);
//    printf("hello totoro\n");
//    return 0;
//}

//extern char** environ;
//int main()
//{
//    printf("hello dudu\n");
//    pid_t id;
//    if((id = fork()) == 0)
//    {
//        //child process
//        char* const argv[] = {(char* const)"./others", NULL};
//        //execve is a system call
//        execve("./others", argv, environ);
//        exit(errno);
//    }
//    waitpid(-1, NULL, 0);
//    printf("hello totoro\n");
//    return 0;
//}

//extern char** environ;
//int main()
//{
//    printf("hello dudu\n");
//    pid_t id;
//    if((id = fork()) == 0)
//    {
//        //child process
//        char* const argv[] = {(char* const)"ls", (char* const)"-l", (char* const)"-n",  NULL};
//        //execve is a system call
//        //execve("ls", argv, environ);//这样子写,execve找不到"ls"指令，需要指定路径
//        execve("/usr/bin/ls", argv, environ);
//        exit(errno);
//    }
//    waitpid(-1, NULL, 0);
//    printf("hello totoro\n");
//    return 0;
//}



int main()
{
    printf("hello dudu\n");
    pid_t id;
    if((id = fork()) == 0)
    {
        //child process
        char* const argv[] = {(char* const)"./others", (char* const)"-l", (char* const)"-n",  NULL};
        char* const envg[] = {(char* const)"MYENV=123", NULL};
        execve("./others", argv, envg);
        exit(errno);
    }
    waitpid(-1, NULL, 0);
    printf("hello totoro\n");
    return 0;
}














































































































































































































































































































































































































































































































































